def vs async def正是製做Tool前先來了解一下常見的兩個函數定義方法,分別是 def 和 async def ,這兩個到底哪裡不一樣呢?
def (同步)def 關鍵字用於定義一個常規函式,當呼叫常規函式時,程式的執行會被阻塞,直到函式返回。
import time
def say_hello(name: str):
print(f"準備向 {name} 問好...")
time.sleep(2) # 模擬一個阻塞的 I/O 操作
print(f"你好, {name}!")
say_hello("世界")
say_hello("使用者")
say_hello("世界")。say_hello("使用者")。總執行時間約為 4 秒。
async def (非同步)async def 關鍵字用於定義一個協程,這是一種可以暫停和恢復的特殊函式。
協程用於非同步程式設計,允許程式在等待操作完成時執行其他任務。
import asyncio
async def say_hello(name: str):
print(f"準備向 {name} 問好...")
await asyncio.sleep(2) # 非阻塞的睡眠
print(f"你好, {name}!")
async def main():
await asyncio.gather(
say_hello("世界"),
say_hello("使用者")
)
asyncio.run(main())
asyncio.run(main()) 啟動事件循環。main() 呼叫 asyncio.gather() 並傳入兩個 say_hello 協程。say_hello("世界")。await asyncio.sleep(2) 暫停協程,並允許事件循環執行其他任務。say_hello("使用者")。await asyncio.sleep(2) 也暫停這個協程。asyncio.sleep() 呼叫完成。say_hello 協程恢復並輸出「你好, 世界!」。say_hello 協程恢復並輸出「你好, 使用者!」。總執行時間約為 2 秒,因為兩個 say_hello 協程是並發執行的。
| 功能 | def |
async def |
|---|---|---|
| 類型 | 常規函式 | 協程 |
| 執行 | 同步 | 非同步 |
| 阻塞 | 是 | 否 (與 await 一起使用時) |
| 使用場景 | 通用函式 | I/O 密集型和高階結構化網路程式碼 |